home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / sokoban-.tar / sokoban-src.tar / sokoban / showscreen.c < prev    next >
C/C++ Source or Header  |  1992-05-16  |  6KB  |  218 lines

  1. #include <curses.h>
  2. #include "sokoban.h"
  3. #include <stdio.h>
  4.  
  5. extern short rows, cols, level, moves, pushes, packets, savepack;
  6. extern char  map[MAXROW+1][MAXCOL+1];
  7.  
  8. showscreen() {
  9.  
  10.    register short i, j;
  11.  
  12.    move( 0, 0); clrtobot();
  13.    for( i = 0; i < rows; i++)
  14.       for( j = 0; map[i][j] != '\0'; j++)
  15.          mapchar( map[i][j], i, j);
  16.    move( MAXROW, 0);
  17.    printw( "Level:      Packets:      Saved:      Moves:       Pushes:");
  18.    displevel();
  19.    disppackets();
  20.    dispsave();
  21.    dispmoves();
  22.    disppushes();
  23.    move( MAXROW+2,0);
  24.    refresh();
  25. }
  26.  
  27. mapchar( c, i, j) 
  28. register char c; 
  29. register short i, j;
  30. {
  31.    OBJECT *obj, *get_obj_adr();
  32.    register short offset_row = (MAXROW - rows) / 2;
  33.    register short offset_col = MAXCOL - cols;
  34.  
  35.    obj = get_obj_adr( c);
  36.  
  37.    if( obj->invers) standout();
  38.    move( i + offset_row, 2*j + offset_col); 
  39.    printw( "%c%c", obj ->obj_display1, obj ->obj_display2);
  40.    if( obj->invers) standend();
  41. }
  42.  
  43. OBJECT *get_obj_adr( c)
  44. register char c;
  45. {
  46.    register OBJECT *ret;
  47.  
  48.    if(      c == player.obj_intern)        ret = &player;
  49.    else if( c == playerstore.obj_intern)    ret = &playerstore;
  50.    else if( c == store.obj_intern)        ret = &store;
  51.    else if( c == save.obj_intern)        ret = &save;
  52.    else if( c == packet.obj_intern)        ret = &packet;
  53.    else if( c == wall.obj_intern)        ret = &wall;
  54.    else if( c == ground.obj_intern)        ret = &ground;
  55.    else                                         ret = &ground;
  56.  
  57.    return( ret);
  58. }
  59.  
  60.  
  61. displevel() { 
  62.    move( MAXROW, 7); printw( "%3d", level); 
  63. }
  64.    
  65. disppackets() { 
  66.    move( MAXROW, 21); printw( "%3d", packets); 
  67. }
  68.    
  69. dispsave() { 
  70.    move( MAXROW, 33); printw( "%3d", savepack); 
  71. }
  72.    
  73. dispmoves() { 
  74.    move( MAXROW, 45); printw( "%5d", moves); 
  75. }
  76.       
  77. disppushes() { 
  78.    move( MAXROW, 59); printw( "%5d", pushes); 
  79. }
  80.  
  81. helpmessage() {
  82.    move( MAXROW+2, 0); 
  83.    printw( "Press ? for help.");
  84.    refresh();
  85.    sleep( 1);
  86.    move( MAXROW+2, 0); deleteln();
  87.    refresh(); 
  88. }
  89.  
  90. static char *helppages[] = { /* be sure that there are max 9 lines per page */
  91.    "The problem is to push packets to",
  92.    "saving positions by moving around",
  93.    "and  pushing only one packet at a",
  94.    "        time if possible.        ",
  95.    "                                 ",
  96.    "                                 ",
  97.    "                                 ",
  98.    "                                 ",
  99.    "                                 ",
  100.    NULL,                    /* end of page */
  101.    "Moving: You can move by using    ",
  102.    "           the vi-keys hjkl.     ",
  103.    "                                 ",
  104.    "              left right up down ",
  105.    "  Move/Push     h    l    k   j  ",
  106.    "  Run/Push      H    L    K   J  ",
  107.    "  Run only     ^H   ^L   ^K  ^J  ",
  108.    "                                 ",
  109.    "                                 ",
  110.    NULL,                    /* end of page */
  111.    "Other commands:                  ",
  112.    "   c:  temporary save            ",
  113.    "   q:  quit                      ",
  114.    "  ^R:  refresh the screen        ",
  115.    "   s:  save the game             ",
  116.    "   u:  undo last move/push       ",
  117.    "   U:  undo all                  ",
  118.    "  ^U:  reset to temp save        ",
  119.    "   ?:  this help scree           ",
  120.    NULL,                    /* end of page */
  121.    "Characters on screen are:        ",
  122.    "                                 ",
  123.    "  %@  player                     ",
  124.    "  %+  player on saving position  ",
  125.    "  %.  saving position for packet ",
  126.    "  %$  packet                     ",
  127.    "  %*  saved packet               ",
  128.    "  %#  wall                       ",
  129.    "                                 ",
  130.    NULL,                /* end of page */
  131.    "If you set a temporary  save, you",
  132.    "need not  undo  all when you  get",
  133.    "stucked. Just reset to this save.",
  134.    "                                 ",
  135.    "A temporary save is automatically",
  136.    "made at the start.",
  137.    "                                 ",
  138.    "                                 ",
  139.    "                                 ",
  140.    NULL,                    /* end of page */
  141.    NULL                        /* total end */
  142. };
  143.  
  144. static char *title[] = {
  145.    "          S O K O B A N          ",
  146.    "---------------------------------"
  147. };
  148.  
  149. static char *helphelp[] = {
  150.    "   (Press return to exit help,   ",
  151.    "    any other key to continue)   "
  152. };
  153.  
  154. #define HELPROWS    16
  155. #define HELPCOLS    37
  156.  
  157. showhelp() {
  158.  
  159.    register short line, i;
  160.    short goon = 1;
  161.    WINDOW *win, *makehelpwin();
  162.  
  163.    win = makehelpwin();
  164.    for( i = 0, line = 2; goon; i++, line++) {
  165.       if( helppages[i] != NULL) {
  166.      wmove( win, line+1, 2);
  167.      printhelpline( win, helppages[i]);
  168.       }
  169.       else {
  170.      wmove( win, HELPROWS-1, 0);
  171.      wrefresh( win);
  172.      if( (goon = (wgetch( win) != '\n'))) {
  173.         line = 1;
  174.         if( helppages[i+1] == NULL) i = -1;
  175.      }
  176.       }
  177.    }
  178.    werase( win);
  179.    wrefresh( win);
  180.    delwin( win);
  181. }
  182.  
  183. WINDOW *makehelpwin() {
  184.  
  185.    WINDOW *win, *newwin();
  186.  
  187.    win = newwin( HELPROWS, HELPCOLS, 2, 0);
  188.    box( win, '|', '-');
  189.    wmove( win, 1, 2);
  190.    wprintw( win, "%s", title[0]);
  191.    wmove( win, 2, 2);
  192.    wprintw( win, "%s", title[1]);
  193.    wmove( win, HELPROWS-3, 2);
  194.    wprintw( win, "%s", helphelp[0]);
  195.    wmove( win, HELPROWS-2, 2);
  196.    wprintw( win, "%s", helphelp[1]);
  197.  
  198.    return( win);
  199. }
  200.  
  201. printhelpline( win, line)
  202. WINDOW *win;
  203. char *line;
  204. {
  205.    OBJECT *obj, *get_obj_adr();
  206.  
  207.    for( ; *line != '\0'; line++) {
  208.       if( *line == '%') {
  209.      ++line;
  210.      obj = get_obj_adr( *line);
  211.          if( obj -> invers) wstandout( win);
  212.          waddch( win, obj -> obj_display1); waddch( win, obj -> obj_display2);
  213.          if( obj -> invers) wstandend( win);
  214.       }
  215.       else waddch( win, *line);
  216.    }
  217. }
  218.